# -*- coding: utf-8 -*- 
# vim: set fileencoding=utf-8 :

from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response, redirect
from django.contrib.auth import authenticate, login
from django.forms import ModelForm
from django.core.exceptions import ObjectDoesNotExist
import datetime

from hashlib import md5

from panel.models import Conf, Usuario, Grupo
from panel.models import ConfForm, GrupoForm, UsuarioForm

class requer_login(object):
    def __init__(self, f):
        self.f = f
    def __call__(self, r, *args, **kwargs):
        if not r.session.get('autorizado', False):
            return redirect('/')
        else:
            return self.f(r, *args, **kwargs)


@requer_login
def logout(request):
    if 'autorizado' in request.session:
        del request.session['autorizado']
    if 'usuario' in request.session:
        del request.session['usuario']
    if 'revenda' in request.session:
        del request.session['revenda']
    if 'admin' in request.session:
	del request.session['admin']
    aviso = 'Muito obrigado por utilizar o sistema.'
    return render_to_response('index.html', locals(), context_instance=RequestContext(request))


def index(request):
    erros = []
    request.session.set_expiry(3600)
    page = 'falha_geral.html'    
    usuario = None
    if request.method=='POST' and request.POST.has_key('username') and request.POST.has_key('password'):
        try:

	    #revenda_padrao = Conf.objects.get(chave='revenda.padrao')
            usuario = Usuario.objects.get(usuario=request.POST['username'], senha=request.POST['password'])
	    if usuario:
		if usuario.admin == 's':
		    request.session['admin'] = usuario
		if usuario.revenda == 's':
		    request.session['revenda'] = usuario
		aviso = 'Acesso Autorizado.'
		request.session['autorizado'] = True
		request.session['usuario'] = usuario
		page = 'home.html'
            else:
                erros.append('Acesso Negado!')
        except:
            
            page = "index.html"
            
            if not request.POST['username']:
                erros.append('O campo "Usuário" é obrigatório.')
            elif not request.POST['password' ]:
                erros.append('O campo "Senha" é obrigatório.')            
            elif not usuario:
                erros.append('Acesso Negado. Usuário ou Senha inválidos. Tente Novamente.')
                        
            #erros.append('Acesso Negado. Tente Novamente.')
    elif request.session.get('autorizado', None):
	page = 'home.html'
    else:
	page = "index.html"

    return render_to_response(page, locals(), context_instance=RequestContext(request))
    

def conf(request, id=None):
    form_invalido = False
    try:
        conf = Conf.objects.get(pk=id)
    except:
        conf = None
    form = ConfForm(request.POST or None, instance=conf if conf else None)
    if request.method == "POST":
        if form.is_valid():
            form.save()
            aviso = "Configuração salva com sucesso!"
        else:
            form_invalido = True
    return render_to_response('conf.html', locals(), context_instance=RequestContext(request))


@requer_login
def confs(request):
    confs = Conf.objects.all()
    if not confs:
        aviso = "Não existem configurações cadastradas."
    return render_to_response('confs.html', locals())


@requer_login
def remover_conf(request,id=None):
    excluir = True
    try:
        c = Conf.objects.get(id=id)
        conf = c.chave
        if request.GET.has_key('excluir') and request.GET['excluir'] == 'ok':
            c.delete()
            excluir = False
    except:
        erros = [ 'Configuração inválida.' ]
    return render_to_response('remover_conf.html', locals())



def grupo(request, id=None):
    form_invalido = False
    try:
        grupo = Grupo.objects.get(pk=id)
    except:
        grupo = None
    
    form = GrupoForm(request.POST, request.FILES, instance=grupo)
    if request.method == "POST":
        if form.is_valid():
	    nome = request.POST['nome']
	    descricao = request.POST['descricao']
	    
	    grupo = Grupo(nome = nome, descricao = descricao)	    	    
	    grupo.save()
            #form.save()
            aviso = "Grupo salvo com sucesso!"
	    form = GrupoForm()
        else:
            form_invalido = True
    else:
	form = GrupoForm(instance=grupo)
    return render_to_response('grupo.html', locals(), context_instance=RequestContext(request))

def handle_uploaded_file(file):
    
    if file:	
	nome_arquivo = 'media/logos/%s.%s' % (datetime.datetime.now(), file.name.split('.')[-1])
        destination = open(nome_arquivo, 'wb+')
        for chunk in file.chunks():
            destination.write(chunk)
        destination.close()
    
    return nome_arquivo
    
@requer_login
def grupos(request):
    
    grupos = Grupo.objects.all()
    if not grupos:
        aviso = "Não existem grupos cadastrados."
    return render_to_response('grupos.html', locals())


def usuario(request,id=None):
    
    
    erros = []

    usuario = ''
    admin = 'n'
    senha = ''
    resenha = ''
    pessoa = 'f'
    nome = ''
    cpf_cnpj = ''
    rg_ie = ''
    endereco = ''
    bairro = ''
    cidade = ''
    estado = ''
    cep = ''
    telefone = ''
    celular = ''
    email = ''
    revenda = 'n'
    fantasia = ''
    logo = ''
    contatos = ''
    grupo = None
    form = UsuarioForm();
    
    
    if id:
        try:
            u = Usuario.objects.get(id=id)
            id = u.id
            usuario = u.usuario
            admin = u.admin
            senha = u.senha
            resenha = u.senha
            pessoa = u.pessoa
            nome = u.nome
            cpf_cnpj = u.cpf_cnpj
            rg_ie = u.rg_ie
            endereco = u.endereco
            bairro = u.bairro
            cidade = u.cidade
            estado = u.estado
            cep = u.cep
            telefone = u.telefone
            celular = u.celular
            email = u.email
            revenda = u.revenda
            fantasia = u.fantasia
            logo = u.logo
            contatos = u.contatos
	    grupo = u.grupo
	    form = UsuarioForm(instance=u);
        except:
            id = ''



    if request.POST.has_key('acao'):
        usuario = request.POST['usuario']
        admin = request.POST['admin']
        senha = request.POST['senha']
        resenha = request.POST['re-senha']
        pessoa = request.POST['pessoa']
        nome = request.POST['nome']
        cpf_cnpj = request.POST['cpf_cnpj']
        rg_ie = request.POST['rg_ie']
        endereco = request.POST['endereco']
        bairro = request.POST['bairro']
        cidade = request.POST['cidade']
        estado = request.POST['estado']
        cep = request.POST['cep']
        telefone = request.POST['telefone']
        celular = request.POST['celular']
        email = request.POST['email']
        revenda = request.POST['revenda']
	if request.POST['grupo'] == '':
	    grupo_padrao = Conf.objects.get(chave='grupo.padrao')
	    grupo_id = grupo_padrao.valor
	else:
	    grupo_id = request.POST['grupo']
	    
	grupo = Grupo.objects.get(pk=grupo_id)
	
        if revenda == 's':
            if request.POST.has_key('fantasia'):
                fantasia = request.POST['fantasia']
            if request.POST.has_key('logo'):
                logo = request.POST['logo'] or request.POST['logo_file']
            if request.POST.has_key('contatos'):
                contatos = request.POST['contatos']

        if not request.POST['celular'] or \
           not request.POST['senha' ] or \
           not request.POST['re-senha' ] or \
           not request.POST['nome'] or \
           not request.POST['telefone'] or \
           not request.POST['email'] or \
           not request.POST['rg_ie'] or \
           not request.POST['bairro'] or \
           not request.POST['cpf_cnpj'] or \
           not request.POST['cep'] or \
           not request.POST['estado'] or \
           not request.POST['usuario'] or \
           not request.POST['cidade'] or \
	   not request.POST['grupo'] or \
           not request.POST['endereco']:
            erros.append('Todos os campos são obrigtórios. Favor preencher corretamente.')

        if request.POST['revenda'] == 's':
            if not request.POST['fantasia'] or not request.POST['contatos']:
                erros.append('Se o usuário for revenda, favor preencher os campos Nome da Revenda e Contatos da Revenda.')

        if request.POST['senha'] != request.POST['re-senha']: erros.append('As senhas não conferem.')

        if request.POST['acao'] and not erros:
            if request.POST['acao'] == 'cadastrar_usuario':
                u = Usuario( usuario = usuario, admin = admin, senha = senha, pessoa = pessoa, nome = nome,
                    cpf_cnpj = cpf_cnpj, rg_ie = rg_ie, endereco = endereco, bairro = bairro, cidade = cidade,
                    estado = estado, cep = cep, telefone = telefone, celular = celular, email = email,
                    revenda = revenda, fantasia = fantasia, contatos = contatos, grupo = grupo )
            elif request.POST['acao'] == 'editar_usuario':
                u = Usuario.objects.get(id=id)
                u.usuario = usuario
                u.admin = admin
                u.senha = senha
                u.pessoa = pessoa
                u.nome = nome
                u.cpf_cnpj = cpf_cnpj
                u.rg_ie = rg_ie
                u.endereco = endereco
                u.bairro = bairro
                u.cidade = cidade
                u.estado = estado
                u.cep = cep
                u.telefone = telefone
                u.celular = celular
                u.email = email
                u.revenda = revenda
                u.fantasia = fantasia
                u.contatos = contatos
		u.grupo = grupo

            

            if request.FILES.has_key('logo'):
                arquivo = request.FILES['logo']
                nome_arquivo = 'media/logos/%s.%s' % (u.id, arquivo.name.split('.')[-1])
                try:
                    destination = open(nome_arquivo, 'wb+')
                    for chunk in arquivo.chunks():
                        destination.write(chunk)
                    destination.close()
                    u.logo = nome_arquivo
                    
                except:
                    erros.append('Não foi possível salvar o arquivo do logo. Tente novamente.')

            if request.POST.has_key('remover_logo') and request.POST['remover_logo'] == 'sim':
                u.logo = ''

            #if request.POST['acao'] == 'cadastrar_usuario':
             #   u.grupo = u.id

            u.save()

            if not erros:
                usuario = ''
                admin = 'n'
                senha = ''
                resenha = ''
                pessoa = 'f'
                nome = ''
                cpf_cnpj = ''
                rg_ie = ''
                endereco = ''
                bairro = ''
                cidade = ''
                estado = ''
                cep = ''
                telefone = ''
                celular = ''
                email = ''
                revenda = 'n'
                fantasia = ''
                logo = ''
                contatos = ''

                aviso = "Usuário salvo com sucesso!"

    return render_to_response('usuario.html', locals(), context_instance=RequestContext(request))


@requer_login
def usuarios(request):
    usuarios = Usuario.objects.all()
    if not usuarios:
        aviso = "Não existem usuários cadastrados!"
    return render_to_response('usuarios.html', locals())


@requer_login
def remover_usuario(request,id=None):
    excluir = True
    try:
        u = Usuario.objects.get(id=id)
        usuario = u.usuario
        if request.GET.has_key('excluir') and request.GET['excluir'] == 'ok':
            u.delete()
            excluir = False
    except:
        erros = [ 'Usuário inválido.' ]
    return render_to_response('remover_usuario.html', locals())


